package service

import (
	"context"
	"errors"
	"github.com/gin-gonic/gin"
	"net/http"
	"strconv"
	"time"
	"user-center/common"
	"user-center/config"
	"user-center/model"
)

func Test(c *gin.Context) {
	c.String(http.StatusOK, "hello register")
}

// UserRegister 用户注册
/*
1. 用户账号应该大于等于3
2. 用户密码应该大于等于6
3. 用户账号不能重复
4. 用户两次输入密码应该相同
5. 用户权限设置为0
6. 创建时间为当前时间
7. 更新时间为当前时间
失败就返回错误，成功就返回true 代表保存成功
*/
func UserRegister(c *gin.Context) {
	var user model.User
	userAccount := c.PostForm("userAccount")
	userPassword := c.PostForm("userPassword")
	checkPassword := c.PostForm("checkPassword")
	if len(userAccount) == 0 || len(userPassword) == 0 || len(checkPassword) == 0 {
		c.JSON(http.StatusBadRequest, common.NewError("user", errors.New("输入不能为空")))
		return
	} else if len(userPassword) < 6 || len(userAccount) < 3 {
		c.JSON(http.StatusBadRequest, common.NewError("user", errors.New("输入长度过短")))
		return
	} else if userPassword != checkPassword {
		c.JSON(http.StatusBadRequest, common.NewError("user", errors.New("两次输入密码不同")))
		return
	}
	user.UserAccount = userAccount
	user.UserPassword = userPassword
	user.UserAuth = 0
	user.CreateTime = time.Now()
	user.UpdateTime = time.Now()
	err := model.SaveUser(&user)
	if err != nil {
		c.JSON(http.StatusNotFound, common.NewError("databases", err))
		return
	}
	c.JSON(http.StatusOK, true)
}

// UserLogin 用户登录
/*
1. 用户账号应该大于等于3
2. 用户密码应该大于等于6
3. 将用户登录态存取到redis中
*/
func UserLogin(c *gin.Context) {
	userAccount := c.PostForm("userAccount")
	userPassword := c.PostForm("userPassword")
	if len(userAccount) == 0 || len(userPassword) == 0 {
		c.JSON(http.StatusBadRequest, common.NewError("user", errors.New("输入不能为空")))
		return
	} else if len(userPassword) < 6 || len(userAccount) < 3 {
		c.JSON(http.StatusBadRequest, common.NewError("user", errors.New("输入长度过短")))
		return
	}
	user, err := model.GetUserByCondition(&model.User{UserAccount: userAccount})
	if err != nil {
		c.JSON(http.StatusNotFound, common.NewError("databases", err))
		return
	}
	rdb := config.InitRedis()
	RedisErr := rdb.Set(context.Background(), common.UserLoginSession, user.Id, time.Hour).Err()
	if RedisErr != nil {
		c.JSON(http.StatusBadRequest, common.NewError("redis", RedisErr))
		return
	}
	c.JSON(http.StatusOK, "登录成功")
}

// UserLogout 用户登出
/*
用户退出，直接删除这个登录态session就好了
*/
func UserLogout(c *gin.Context) {
	rdb := config.InitRedis()
	_, err := rdb.Del(context.Background(), common.UserLoginSession).Result()
	if err != nil {
		c.JSON(http.StatusBadRequest, common.NewError("user", errors.New("用户未登录")))
	}
	c.JSON(http.StatusOK, "退出成功")
}

// UserUpdate
/*
不同的系统，用户的键不同，可以更新的东西也有不同。
*/
func UserUpdate(c *gin.Context) {

}

// GetAllUser
/*
获取所有的用户信息
如果获取失败返回404，和错误信息，成功返回所有用户信息。
*/
func GetAllUser(c *gin.Context) {
	userList, err := model.GetAllUser()
	if err != nil {
		c.JSON(http.StatusNotFound, common.NewError("databases", errors.New("获取所有用户失败")))
		return
	} else {
		c.JSON(http.StatusOK, userList)
	}
}

// GetUserById
/*
根据id获取用户
获取的id转换为整数类型，然后取数据库查询。
失败返回错误信息，成功返回用户信息。
*/
func GetUserById(c *gin.Context) {
	idString := c.Param("id")
	id, _ := strconv.Atoi(idString)
	user, err := model.GetUserByCondition(&model.User{Id: id})
	if err != nil {
		c.JSON(http.StatusNotFound, common.NewError("databases", errors.New("用户获取失败")))
	} else {
		c.JSON(http.StatusOK, user)
	}
}
